package io.gitee.baicaixiaozhan.httpmessageconverter.annotation;

import java.lang.annotation.*;

/**
 * DESC: 数据脱敏注解
 *
 * @author baicaixiaozhan
 * @since v1.0.0
 */
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.FIELD, ElementType.ANNOTATION_TYPE})
@Documented
public @interface Desensitize {

    /**
     * 脱敏模式
     *
     * @return {@link Pattern}
     */
    Pattern pattern() default Pattern.DEFAULT;

    /**
     * 开始下标（包含下标），当使用 {@link Pattern#RANGE} 时有效
     *
     * @return {@link String}
     */
    String start() default "0";

    /**
     * 结束下标（不包含下标），当使用 {@link Pattern#RANGE} 时有效
     *
     * @return {@link String}
     */
    String end() default "0";

    /**
     * 分隔符
     *
     * @return char
     */
    char delimiter() default '*';

    enum Pattern {
        /**
         * 默认：全部字符使用 delimiter 替换
         * <p>
         *     origin: 12345 => target: *****
         * </p>
         */
        DEFAULT,

        /**
         * 中文名：除姓氏外全部使用 delimiter 替换
         * <p>
         *     origin: 张三丰 => target: 张**
         * </p>
         */
        FULL_NAME,

        /**
         * 身份证：除首末位外全部使用 delimiter 替换
         * <p>
         *     origin: 11010119900307061X => target: 1****************X
         * </p>
         */
        ID_CARD,

        /**
         * 手机号码：除前3位、后4位外全部使用 delimiter 替换
         * <p>
         *     origin: 13811113876 => target: 138****3876
         * </p>
         */
        MOBILE_PHONE,

        /**
         * 固定电话号码：除前4位、后2位外全部使用 delimiter 替换
         * <p>
         *     origin: 09151111179 => target: 0915*****79
         * </p>
         */
        FIXED_TELEPHONE,

        /**
         * 邮箱：除首位、@符号后n位外全部使用 delimiter 替换
         * <p>
         *     origin: 09151111179 => target: z*******@gmail.com
         * </p>
         */
        EMAIL,

        /**
         * 范围：根据给定的 start（包含）、end（不包含） 下标值，支持 SpringEL 表达式
         * <p>
         *     给定 start = "2"、end = "5" | start = "2"、end = "#str.length() - 5"
         * </p>
         * <p>
         *     origin: 1234567890 => target: 12***67890
         * </p>
         */
        RANGE
    }

}
